<?php
/*
| --------------------------------------------------------
| 	文件功能：系统通用核心函数定义文件（所有函数均以sys_开头）（表示system系统）
|	程序作者：王海滨（技术部）
|	时间版本：2015.3.18
|	特别提示：本核心函数文件作为FrameWork的底层承载部分，由王海滨专职维护，请勿更改
| --------------------------------------------------------
*/
//嵌入系统核心文件
require_once "config.inc.php";
require_once "classes/mail.class.php";
require_once "classes/sms.class.php";
require_once "extend.inc.php";	//加载业务扩展函数定义文件(加载顺序必须在mysql.class.php之后)

//重写$_GET,$_POST,$_REQUEST,$SESSION "读取" 机制，防止sql注入攻击，屏蔽Notice型报警
function _GET($parm){ 
	return isset($_GET[$parm]) ? sys_check_string($_GET[$parm]) : ""; //默认返回空串 
} 
function _POST($parm){ 
	return isset($_POST[$parm]) ? sys_check_string($_POST[$parm]) : ""; //默认返回空串 
} 
function _REQUEST($parm){ 
	return isset($_REQUEST[$parm]) ? sys_check_string($_REQUEST[$parm]) : ""; //默认返回空串 
} 
function _SESSION($parm){ 
	return isset($_SESSION[$parm]) ? sys_check_string($_SESSION[$parm]) : ""; //默认返回空串 
} 

//字符串安全过滤，防止sql注入
function sys_check_string($string)
{
	$string = trim($string);
	$result=trim(preg_replace('/习近平|TMD|法轮功|操逼|操你妈|草你妈|阴茎|阴屄|屌|FUCK|AV女优|激情|中华民国|共产党|王八蛋|王八羔子|傻逼|二逼|二货/','*',$string));//过滤敏感词汇
	$result = sys_strip_sql($result);
	$result = str_replace("'",'',$result);//屏蔽单引号，否则会影响JSON解析
	$result = str_replace('"','',$result);//屏蔽双引号，否则会影响JSON解析
	return $result;
}
//字符串安全过滤
function sys_strip_sql($string) {
	$search = array("/union/i","/0x([a-z0-9]{2,})/i","/select([[:space:]\*\/\-])/i","/update([[:space:]\*\/])/i","/replace([[:space:]\*\/])/i","/delete([[:space:]\*\/])/i","/drop([[:space:]\*\/])/i","/outfile([[:space:]\*\/])/i","/dumpfile([[:space:]\*\/])/i","/load_file\(/i","/substring\(/i","/substr\(/i","/concat\(/i","/concat_ws\(/i","/ascii\(/i","/hex\(/i","/ord\(/i","/char\(/i");
	$replace = array('unio&#110;','0&#120;\\1','selec&#116;\\1','updat&#101;\\1','replac&#101;\\1','delet&#101;\\1','dro&#112;\\1','outfil&#101;\\1','dumpfil&#101;\\1','load_fil&#101;(','substrin&#103;(','subst&#114;(','conca&#116;(','concat_w&#115;(','asci&#105;(','he&#120;(','or&#100;(','cha&#114;(');
	return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search, $replace, $string);
}

//循环检测并创建多级目录
function sys_mkdir($dir) 
{ 
	if (is_dir($dir) || @mkdir($dir,0777,true))//ture表示级联创建目录
	{
		chmod($dir,0777); //一定要单独提权，否则会有umask问题 
		return true; 
	} 
	if (!sys_mkdir(dirname($dir))) return false; 
}

//判断操作系统类型
function sys_isLinuxOS()
{
	return (strrpos(strtolower(PHP_OS),"win") === false);
}

//获取系统提示语 language.inc.php
function sys_get_msg($parm){
	global $msg;	
	return $msg[$parm];
}

//获取系统唯一串号
function sys_get_no()
{
	//时间戳再加4位随机数，共18位
	return date("YmdHis").sys_create_code();
}
//获取系统交易订单号（统一支付宝，银联交易单号）
function sys_get_payno($type_prefix="CZ",$uid)//默认充值类型
{
	//格式形如："2位业务类型前缀(大写字母)+14位时间戳+"ID"+client_id(非固定长度)"（举例：GM20140917172349ID2）；
	return $type_prefix.date("YmdHis").rand(0000,9999)."ID".$uid;
}
//获取4位定长数字随机串
function sys_create_code()
{
	return rand(1000,9999);
}

//字符串长度检查
function sys_check_length($str,$minLen,$maxLen)
{
	if(empty($str) || strlen($str)<$minLen || strlen($str)>$maxLen)
		return false;
}

//重写判空函数（把0排除）
function sys_check_empty($parm)
{
	if(!isset($parm) || strlen(trim($parm))==0)
		return true;
	return false;		
}
//检测多个post参数是否完整并且不为空值
function sys_check_post($post_array) {
	foreach ($post_array as $parm) {
		if (!isset($_POST[$parm]) || sys_check_empty($_POST[$parm])) {
		    //@TODO  取消所有非空限制
			// sys_out_fail($parm." 参数不能为空",100);
			return false;
		}
	}	
}

//退出登录
function sys_login_out()
{
	session_unset(); //释放内存
	session_destroy(); //删除临时文件
}

//根据client_id来生成并返回token
function sys_get_token($client_id,$nickname)
{	
	$myToken = "TK_".sys_create_code()."_".$client_id;//命名规则：TK_6位随机数_用户主键ID
	$_SESSION['client_id']=$client_id;
	$_SESSION['nickname']=$nickname;	
	$_SESSION['token']=$myToken;	
	return $myToken;
}

//=============================================
//=============================================
//=============================================

/**
 *根据中心点经纬度，来计算以radius千米为距离半径，所画圆圈的正切正方形的四个点坐标
 *
 *param lng float 经度
 *param lat float 纬度
 *param radius float 该点所在圆的半径，默认值为10 千米
 *return array 正方形的四个点的经纬度坐标
 */
function sys_get_squarePoint($lng, $lat,$radius = 10){
 
    $dlng =  2 * asin(sin($radius /12742) / cos(deg2rad($lat)));//12742为地球直径
    $dlng = rad2deg($dlng);
	     
    $dlat = $radius/6371; //6371为地球平均半径
    $dlat = rad2deg($dlat);
     
    return array(
                'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
                'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
                'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
                'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
                );
}

//////////////////============= 手机&邮件发送 =============////////////////////

//发送验证码
function sys_send_code($username)
{
   // sys_send_mail($username,"内容","内容1");//如果是邮箱验证，则需要发送电子邮件
	if(SYS_DEBUG_MODE)//
	{
		$_SESSION['verify_code']='123456';   //测试阶段，固定使用1234
	}
	else
	{
		if(sys_check_empty(_SESSION('verify_code')))
		{
			$_SESSION['verify_code']=sys_create_code();	 //确保同一用户重发同一验证码
		}
		// $content="验证码："._SESSION('verify_code');//编辑发送内容
		$content=_SESSION('verify_code');//编辑发送内容
		//$content = "【河马移动】您的验证码："._SESSION('verify_code')."，有效时间5分钟";
		if(sys_check_email($username))//如果是邮箱
			sys_send_mail($username,$content,$content);//如果是邮箱验证，则需要发送电子邮件
		else
		$res = ext_send_alismss($username,$content);//如果是手机验证，则需要发送手机短信
		return $res;
	}	
}
//验证随机码是否正确
function sys_check_code($parmCode)
{
	if(SYS_DEBUG_MODE)
	{
		if($parmCode == "123456") 
			return true;//测试阶段固定传123456
	}
	else
	{
		if(_SESSION('verify_code') && $parmCode ==_SESSION('verify_code')) 
			return true;//正式部署
	}
	return false;	
}
//发送阿里云短信
function ext_send_alisms($mobile,$rand){
	$config = array(
		'accessKeyId' => 'LTAI4FsJxCb3gKxsssSMpWUj',
		'accessKeySecret' => '5Ug2QGmfiHHGubP5NoHvm6epBqOnof',
		'signName' => SYS_ZH_NAME,
		// 登陆
		// SMS_184690031
		'templateCode' => 'SMS_193233872',
	);
	$whbmail=new Alisms($config);
	$a = $whbmail->send_verify($mobile, $rand, '', 1);
	print_r($a);die;
	
}
function ext_send_alismsa($mobile,$user,$date,$hall,$staff,$phone){
	$config = array(
		'accessKeyId' => 'LTAI4FsJxCb3gKxsssSMpWUj',
		'accessKeySecret' => '5Ug2QGmfiHHGubP5NoHvm6epBqOnof',
		'signName' => SYS_ZH_NAME,
		// 登陆
		// 模版CODE:
		// SMS_184690031
		// 模版内容:
		// 验证码${code}，您正在登录，若非本人操作，请勿泄露。
		'templateCode' => 'SMS_193233872',
	);
	$whbmail=new Alisms($config);
	$a = $whbmail->send_verifys($mobile,$user,$date,$hall,$staff,$phone,1);
	return $a;
}
// 登陆
function ext_send_alismss($username,$content){
	$config = array(
		'accessKeyId' => 'LTAI4FsJxCb3gKxsssSMpWUj',
		'accessKeySecret' => '5Ug2QGmfiHHGubP5NoHvm6epBqOnof',
		'signName' => SYS_ZH_NAME,
		// 登陆
		// 模版CODE:
		// SMS_184690031
		// 模版内容:
		// 验证码${code}，您正在登录，若非本人操作，请勿泄露。
		'templateCode' => 'SMS_184690031',
	);
	$whbmail=new Alisms($config);
	$a = $whbmail->send_verifya($username,$content,1);
	// print_r($a);die;
	return $a;
}

//发电子邮件
function sys_send_mail($to,$subject,$message)
{
	$whbmail=new WhbMail();
	$res = $whbmail->send($to,SYS_ZH_NAME."客服中心",$subject,$message);
	unset($whbmail);
	return $res;
} 

//////////////////=================== 系统公共函数 =====================////////////////////

//获取并格式化当前时间
function sys_get_time()
{	
	return date("Y-m-d H:i:s",time());
}
//得到时间间隔(传入之前确保enddate>=startdate,否则为负数)
//$return_type：返回的类型,详见switch内部注释
function sys_get_timespan($startdate,$enddate,$return_type)
{
	//echo(strtotime(date('Y-m-d')) - strtotime($mydate)."<br>");
	$result = 0;
	switch ($return_type)
	{
		case "i"://如果是分
			$result =floor((strtotime($enddate) - strtotime($startdate))/60);
		 	break;
		case "h"://如果是时
			$result =floor((strtotime($enddate) - strtotime($startdate))/3600);
		 	break;
		case "d"://如果是天
			$result =floor((strtotime($enddate) - strtotime($startdate))/3600/24);
		 	break;
		case "w"://如果是周
			$result =floor((strtotime($enddate) - strtotime($startdate))/3600/24/7);
		 	break;
		case "m"://如果是月
			$result =floor((strtotime($enddate) - strtotime($startdate))/3600/24/30);
		 	break;		
		default:
			break;
	}		
	return $result;
}

//根据经纬度计算距离（单位：公里）
function sys_get_distance($lat1, $lng1, $lat2, $lng2)  
{
    // $url ="http://restapi.amap.com/v3/distance?key=917143083eabfd3db728da49501b240f";
    $url ="http://restapi.amap.com/v3/distance?key=995b008c5f79a80112346988eeeb1732";
    $origin_lnglat = $lng1.','.$lat1;
    $destination_lnglat = $lng2.','.$lat2;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "origins=".$origin_lnglat."&destination=".$destination_lnglat."&type=1");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    $result=curl_exec($ch);
    curl_close($ch);
    $r_arr = json_decode($result,true);
    if($r_arr['status']==1){
        $s = $r_arr['results'][0]['distance'];
        $s = round($s/1000,2);
    } else {
        $s=round(12756274*asin(Sqrt(pow(sin(($lat1-$lat2)*0.008726646),2)+Cos($lat1*0.0174533)*Cos($lat2*0.0174533)*pow(sin(($lng1-$lng2)*0.008726646),2)))/1000,2) ;
    }
   return $s;  
} 

//根据出生日期计算年龄
function sys_get_age($parmBirthday){
    $birth=$parmBirthday;
    @list($by,$bm,$bd)=explode('-',$birth);
    $cm=date('n');
    $cd=date('j');
    $age=date('Y')-$by-1;
    if ($cm>$bm || $cm==$bm && $cd>$bd) $age++;
    return $age;
}

//函数功能：将string中的html代码，全部替换成普通文本
function sys_parse_html_single($string)    
{
	$string = strip_tags($string);
	//$string = preg_replace ('/\n/is', '', $string);//保留换行符
	//$string = preg_replace ('/ |　/is', '', $string);//保留原始空格
	$string = preg_replace ('/&nbsp;/is', '', $string);
	$string = preg_replace ('/&amp;/is', '&', $string);
	$string = preg_replace ('/&lt;/is', '<', $string);
	$string = preg_replace ('/&gt;/is', '>', $string);	
	return $string;
}

//函数功能：将temp_array数组中的key1字段中的html代码，全部替换成普通文本
function sys_parse_html($temp_array,$key1)
{
	$result_array = NULL;
	if (is_array($temp_array))
	{		
		foreach($temp_array as $rows)
		{	
			$rows[$key1]=sys_parse_html_single($rows[$key1]);		
			$result_array[]=$rows;		
		}	
	}		
	//print_r($result_array);	
	return($result_array);
}

//////////////////=================== 系统检查 =====================////////////////////

//检测手机号是否合法
function sys_check_mobile($mobile)
{
	$check_result = true;
	//检测机制
	if(strlen($mobile) != 11)
	{
		$check_result = false;
	}
	return $check_result;
}
//判断邮箱是否合法（正则表达式）
function sys_check_email($email)
{
	$pregEmail = "/([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?/i";
    $check_result=preg_match($pregEmail,$email); 
	if($check_result) return true;
	return false;	
}

//通过curl方式获取远程网址内容（file_get_contents(url)效率不如curl高）
function sys_get_curl($url)
{
    $ch = curl_init();   
    curl_setopt($ch, CURLOPT_URL, $url);            //设置访问的url地址   
    //curl_setopt($ch,CURLOPT_HEADER,1);            //是否显示头部信息   
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时      
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301   
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果   
    $result = curl_exec($ch);
    curl_close($ch);   
    return $result;
}

////根据汉字获取拼音
function sys_get_pinyin($str, $charset="utf-8") {
		$restr = '';
		$str = trim($str);
		if ("utf-8" == $charset) {
			$str = iconv("utf-8", "gbk", $str);
		}		
		$slen =strlen($str);
		$pinyins = array();
		$fp = fopen(SYS_ROOT_PATH.'plugins/pinyin.dat', 'r');
		while (!feof($fp)) {
			$line = trim(fgets($fp));
			$pinyins[$line[0] . $line[1]] = substr($line, 3, strlen($line)-3);
		}
		fclose($fp);
		for ($i=0; $i<$slen; $i++) {
			if (ord($str[$i]) > 0x80) {
				$c = $str[$i] . $str[$i+1];
				$i++;
				if (isset($pinyins[$c])) {
					$restr .= $pinyins[$c];
				}else {
					$restr .= "z";
				}
			}elseif (preg_match("/[a-z0-9]/i", $str[$i])) {
				$restr .= $str[$i];
			}else {
				$restr .= "z";
			}
		}
		return $restr;
}
?>